// #include "zf_common_headfile.h"

// // 串口控制步进电机

// // 步进电机控制初始化
// void stepping_motor_init(void)
// {
//     uart_init(STEPPING_MOTOR_UART, STEPPING_MOTOR_UART_BAUD, STEPPING_MOTOR_TX, STEPPING_MOTOR_RX);
//     uart_set_interrupt_config(STEPPING_MOTOR_UART, UART_INTERRUPT_CONFIG_RX_ENABLE); // 使能接收中断
//     interrupt_set_priority(STEPPING_MOTOR_UART_PRIORITY, 1); // 设置中断优先级
//     uart_set_callback(STEPPING_MOTOR_UART, stepping_motor_parse_response, NULL); // 设置接收中断回调
//     uart_write_string(DEBUG_UART_INDEX, "Stepping Motor UART Init Success\r\n"); // 发送初始化成功信息
// }


// // 发送命令数组到步进电机
// /*第一个字节：帧头：为固定值 0x7B。
// 第二个字节：控制 ID，默认为 0x01。
// 第三个字节：控制模式，0x01 为速度控制模式，0x02 为位置控制模式，0x03
// 为力矩控制模式、0x04 为单圈绝对角度控制模式。
// 第四个字节：步进电机的转向，0 为逆时针转动，1 为顺时针转动。
// 第五个字节：步进电机细分值。例如：0x20=32，就是 32 细分，支持 2、4、
// 8、16、32 细分。（尽量不要在低下使用位置控制模式和绝对角度控制模式，会
// 影响精度）
// 第六个字节和第七个字节：速度控制模式下为 0；
//         位置控制模式下的角度数据，单位为角度，放大十倍传输，分别为高八位和低八位。
//         例如:0x27、0x10=0x2710=10000=1000 度；
//         力矩控制模式下的电流大小数据，单位为毫安，分别为高八位和低八位。
//         例如:0x03、0xe8 =0x03e8=1000mA；
//         绝对角度控制模式下的目标角度，放大十倍发送，分别为高八位和低八位。
//         例如:0x03、0xe8=0x03e8=1000/10.0=100 度。
// 第八个字节和第九个字节：转速数据，单位为弧度/s，放大十倍传输，分别为高八位和低八位。
// 例如:0x00、0x64 =0x0064=100=10Rad/s。
// 第十个字节：BCC 校验位，为前面九个字节的异或和。
// 第十一个字节：帧尾，为固定值 0x7D。*/

// // 发送步进电机控制命令(仅使用0x02位置控制模式)
// void stepping_motor_send_command(uint8_t control_id, int16_t angle, uint16_t speed)
// {
//     uint8_t data[11]; // 数据帧长度固定为11字节

//     // 第一个字节：帧头
//     data[0] = 0x7B;

//     // 第二个字节：控制 ID
//     data[1] = control_id;

//     // 第三个字节：控制模式
//     data[2] = 0x02;

//     // 第四个字节：步进电机的转向
//     // data[3] = direction;
//     data[3] = (angle >= 0) ? 1 : 0; // 1 为顺时针转动，0 为逆时针转动

//     // 第五个字节：步进电机细分值
//     data[4] = 0x20;

//     // 第六、七字节：角度（高八位和低八位）
//     data[5] = (angle >> 8) & 0xFF; // 高八位
//     data[6] = angle & 0xFF;        // 低八位

//     // 第八、九字节：转速数据（高八位和低八位）
//     data[7] = (speed >> 8) & 0xFF; // 高八位
//     data[8] = speed & 0xFF;        // 低八位

//     // 第十个字节：BCC 校验位（前面九个字节的异或和）
//     data[9] = data[0] ^ data[1] ^ data[2] ^ data[3] ^ data[4] ^ data[5] ^ data[6] ^ data[7] ^ data[8];

//     // 第十一个字节：帧尾
//     data[10] = 0x7D;

//     // 通过串口发送数据
//     uart_write_buffer(STEPPING_MOTOR_UART, data, sizeof(data));
// }

// //请求步进电机状态，发送7b 01 00 00 00 00 00 00 00 7a 7d
// void stepping_motor_request_status(uint8_t control_id)
// {
//     uint8_t data[11]; // 数据帧长度固定为11字节

//     // 第一个字节：帧头
//     data[0] = 0x7B;

//     // 第二个字节：控制 ID
//     data[1] = control_id;

//     // 第三个字节：控制模式
//     data[2] = 0x00; // 请求状态

//     // 第四个字节：步进电机的转向
//     data[3] = 0x00; // 不需要转向信息

//     // 第五个字节：步进电机细分值
//     data[4] = 0x20; // 32细分

//     // 第六、七、八、九字节：数据填充为0
//     data[5] = 0x00;
//     data[6] = 0x00;
//     data[7] = 0x00;
//     data[8] = 0x00;

//     // 第十个字节：BCC 校验位（前面九个字节的异或和）
//     data[9] = data[0] ^ data[1] ^ data[2] ^ data[3] ^ data[4] ^ data[5] ^ data[6] ^ data[7] ^ data[8];

//     // 第十一个字节：帧尾
//     data[10] = 0x7D;

//     // 通过串口发送数据
//     uart_write_buffer(STEPPING_MOTOR_UART, data, sizeof(data));
// }


// //步进电机数据反馈解析
// /*如接收到的数据为：01 00 00 64 00 00 0e 10 7B，显示的内容则为：目前电
// 机转速为 10rad/s 转动到了 360 度，还没有到达目标位置。如果接收数据为：01 01
// 00 00 00 00 8c a0 2C，显示的内容为：电机已经转动角度达到 3600 度位置。
// 第一个字节：电机的地址，默认为 01；
// 第二个字节：在位置控制模式下，到达目标位置则发送 1，还未到达发送 0；
// 其实模式默认发送 0；
// 第三个字节：速度的高八位；
// 第四个字节：速度的低八位；
// 第五个字节：角度的高 16 位中的高 8 位
// 第六个字节：角度的高 16 位中的低 8 位；
// 第七个字节：角度的低 16 位中的高 8 位；
// 第八个字节：角度的低 16 位中的低 8 位;
// （角度数据带符号，顺时针转动为正数，逆时针转动为负数，负数发送的数
// 据为反码，例如顺时针转动 360 度为 0x00000E10，逆时针转动 360 度为
// 0xFFFFF1F0）
// 第九个字节：BCC 校验位；（CAN 无）*/
// void stepping_motor_parse_response(uint8_t *data, uint8_t length)
// {
//     if (length < 9) {
//         // 数据长度不足，无法解析
//         return;
//     }

//     uint8_t control_id = data[0]; // 控制 ID
//     uint8_t status = data[1];      // 状态信息
//     int16_t speed = (data[2] << 8) | data[3]; // 转速数据
//     int32_t angle = ((int32_t)data[4] << 24) | ((int32_t)data[5] << 16) |
//                     ((int32_t)data[6] << 8) | (int32_t)data[7]; // 角度数据

//     // 打印解析结果
//     printf("Control ID: %d, Status: %d, Speed: %d rad/s, Angle: %d degrees\n",
//                 control_id, status, speed, angle);
// }